package emqx.test.config;

import emqx.test.consumer.EmqxDemoConsumer;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.UUID;

/**
 * 配置类  构建一个 emqx底层客户端对象 类似在rabbitmq创建的connection
 * 所有程序代码 实现消息发送 消息消费 都是通过 连接对象完成
 */
@Configuration
public class MqttClientConfiguration {
    @Bean
    public MqttClient mqttClientInit(){
        MqttClient mqttClient = null;
        try {
            //初始化client对象 提供给他必要的连接属性 ip port amdin public
            String address="tcp://192.168.8.100:1883";//包含协议 ip port的地址
            //每一个客户端 都需要一个独一无二的客户端id值 尤其是分布式集群
            String uuid= UUID.randomUUID().toString();
            //每次启动都会在本地 存储一个日志 锁文件 将这个文件内容 放到内存new MemoryPersistence()
            mqttClient=new MqttClient(address,uuid,new MemoryPersistence());
            //需要在客户端创建完成之后的 选择属性options 以完成功能需要
            MqttConnectOptions options=new MqttConnectOptions();
            //必须填写的授权认证 admin public 用户名密码
            options.setUserName("admin");
            options.setPassword("public".toCharArray());
            //作为了解
            //options.setCleanSession(true);
            //options.setKeepAliveInterval(30);
            //options.setConnectionTimeout(30);
            //options.setAutomaticReconnect(true);
            //通过选项建立client客户端和服务端连接
            //必须填写的属性 消费回调对象 开发消费者
            MqttCallback callback=new EmqxDemoConsumer(mqttClient);
            mqttClient.setCallback(callback);
            mqttClient.connect(options);
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("创建连接失败");
        }
        return mqttClient;
    }













}
